import { CallHandler, ExecutionContext, HttpException, Injectable, NestInterceptor } from '@nestjs/common'
// map 和 Observable：来自 RxJS 库。Observable 是 RxJS 中的核心概念，用于处理异步数据流；
// map 是一个操作符，用于对 Observable 发出的值进行转换。
import { map, Observable, throwError } from 'rxjs'
import { catchError } from 'rxjs/operators'

// 统一成功响应的数据结构
export interface SuccessResponse<T> {
  code: number
  msg: string
  data: T
}

// 统一响应的数据结构
export interface ErrorResponse {
  code: number
  msg: string
}

@Injectable()
export class TransformInterceptor<T> implements NestInterceptor<T, SuccessResponse<T>> {
  // context: ExecutionContext：当前的执行上下文对象。
  // next: CallHandler<T>：处理请求的处理器。
  // next.handle()：调用 handle() 方法触发控制器方法的执行，并返回一个 Observable 对象，表示控制器方法的返回值。
  // .pipe(map(data => ({ code: 200, msg: 'success', data })))：使用 map 操作符对 Observable 发出的值进行转换。
  // 将控制器方法的返回值 data 包装成一个 SuccessResponse 对象，其中 code 为 200，表示成功，msg 为 'success'，data 为控制器方法的原始返回值。
  intercept(context: ExecutionContext, next: CallHandler<T>): Observable<SuccessResponse<T>> | Promise<Observable<SuccessResponse<T>>> {
    return next.handle().pipe(map(data => ({ code: 200, msg: 'success', data })))
  }
}

// 分页的数据
@Injectable()
export class PageTransformInterceptor<T> implements NestInterceptor<T, SuccessResponse<T>> {
  intercept(context: ExecutionContext, next: CallHandler<T>): Observable<SuccessResponse<T>> | Promise<Observable<SuccessResponse<T>>> {
    return next.handle().pipe(map(data => ({ code: 200, msg: 'success', data })))
  }
}